package clientes;

import static org.junit.Assert.*;

import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;

import static org.mockito.Mockito.*;

public class ClientesTest {

	Cliente cliente;
	private CtaCtePesos ctacte;
	private CtaCtePesos ctacteQueNoPasoAlCliente;

	@Before
	public void setUp() throws Exception {

		ctacte = mock(CtaCtePesos.class);
		cliente = new Cliente("Nazareno", "35792749",
				"nazarenomartincastro@gmail.com", "estanislao del campo 2137",
				ctacte);
		cliente.registrarUnaCompra(10D);

		cliente.registrarUnaCompra(15D);

	}

	
	@Test
	public void testGettersCliente(){
		
		assertNotNull(cliente.dni());
		assertNotNull(cliente.domicilio());
		assertNotNull(cliente.ctaCte());
		assertNotNull(cliente.e_mail());
		assertNotNull(cliente.nombre());
	}
	
	@Test
	public void testElClienteSeCreaConLaCtaCorrienteQueSePasaEnElConstructor() {

		ctacteQueNoPasoAlCliente = mock(CtaCtePesos.class);

		assertEquals(ctacte, cliente.ctaCte());
		assertNotEquals(ctacteQueNoPasoAlCliente, cliente.ctaCte());

	}

//	@Test
//	public void testLosMontosSeRegistranConFechasAnterioresAMaanaYaQueLosMontosSeRegistranEnElMomento() {
//
//		assertTrue(cliente.montosDespuesDeFecha(new DateTime(2015, 7,1 , 1, 1)).isEmpty());
//	}

//	@Test
//	public void testLosMontosSeRegistranConFechasPosterioresALaFechaDadaAparecenEnElResultado() {
//
//		assertFalse(cliente.montosDespuesDeFecha(new DateTime(2012, 7,1 , 1, 1)).isEmpty());
//	}
//	@Test
//	public void testLosMontosSeRegistranConFechasAnterioresALaFechaDadaAparecenEnElResultado(){
//		
//		assertFalse(cliente.montosAntesDeFecha(new DateTime(2015, 7,1 , 1, 1)).isEmpty());
//	}
//	@Test
//	public void testLosMontosSeRegistranConFechasAnterioresALaFechaDadaNoAparecenEnElResultado(){
//		
//		assertTrue(cliente.montosAntesDeFecha(new DateTime(2012, 7,1 , 1, 1)).isEmpty());
//	}
	
	@Test
	public void testRegistrarComprasEnUnCliente() {

		assertEquals((10D + 15D), cliente.totalConsumido(), 00D);

	}

	@Test
	public void testElClientePuedePagarUnaCantEspecificaDelMonto() {

		when(ctacte.saldoActual()).thenReturn(100D);

		assertTrue(cliente.puedePagar(10D));
	}

	@Test
	public void testElClienteNoPuedePagarUnaCompraQueExedeElSaldoDeLaCtaCte() {

		when(ctacte.saldoActual()).thenReturn(10D);

		assertFalse(cliente.puedePagar(100D));

	}

}
